package com.chatmcp.mcprouter.jsonrpc;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * JSON-RPC通知类
 * 表示JSON-RPC 2.0协议中的通知对象（没有ID的请求）
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class JsonRpcNotification {

    /**
     * JSON-RPC协议版本，固定为2.0
     */
    private String jsonrpc = JsonRpcConstants.JSONRPC_VERSION;

    /**
     * 通知的方法名
     */
    private String method;

    /**
     * 通知参数，可以是任意JSON值
     */
    private JsonNode params;

    /**
     * 创建一个通知对象
     *
     * @param method 方法名
     * @param params 参数
     * @return 通知对象
     */
    public static JsonRpcNotification of(String method, JsonNode params) {
        return new JsonRpcNotification(JsonRpcConstants.JSONRPC_VERSION, method, params);
    }
    
    /**
     * 将JSON字符串反序列化为通知对象
     *
     * @param data JSON字符串
     * @return 通知对象
     * @throws JsonProcessingException 如果反序列化失败
     */
    public static JsonRpcNotification unmarshalNotification(String data) throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        return mapper.readValue(data, JsonRpcNotification.class);
    }
    
    /**
     * 将通知转换为字符串
     *
     * @return 通知的字符串表示
     */
    @Override
    public String toString() {
        try {
            ObjectMapper mapper = new ObjectMapper();
            return mapper.writeValueAsString(this);
        } catch (JsonProcessingException e) {
            return "{\"jsonrpc\":\"2.0\",\"method\":\"" + method + "\",\"params\":null}";
        }
    }
}